package br.com.ava.core.entrada;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;
import javax.persistence.Transient;
import javax.validation.constraints.NotNull;

import br.com.ava.core.fornecedor.Fornecedor;
import br.com.ava.core.funcionario.Funcionario;
import br.com.ava.core.infra.persistencia.ObjetoPersistente;

@Entity
@Table(name = "entrada")
@SequenceGenerator(name = "identrada_seq", sequenceName = "identrada_seq", allocationSize = 1)
@SuppressWarnings("serial")
public class EntradaProduto extends ObjetoPersistente {

	private Date data;
	private Funcionario funcionario;
	private Fornecedor fornecedor;
	private List<ItemEntrada> itensEntrada;
	private double valorEntrada;

	public EntradaProduto(Date data, Funcionario funcionario,
			Fornecedor fornecedor) {
		this();
		this.data = data;
		this.funcionario = funcionario;
		this.fornecedor = fornecedor;
	}

	public EntradaProduto() {
		super();
		this.itensEntrada = new ArrayList<ItemEntrada>();
	}

	/** {@inheritDoc} */
	@Id
	@GeneratedValue(strategy = GenerationType.AUTO, generator = "identrada_seq")
	@Column(name = "identrada", nullable = false)
	@Override
	public Integer getId() {
		return id;
	}

	@Column(name = "data", nullable = false)
	public Date getData() {
		return data;
	}

	public void setData(Date data) {
		this.data = data;
	}

	@NotNull
	@ManyToOne(targetEntity = Funcionario.class)
	@JoinColumn(name = "idfuncionario", nullable = false, referencedColumnName = "idfuncionario")
	public Funcionario getFuncionario() {
		return funcionario;
	}

	public void setFuncionario(Funcionario funcionario) {
		this.funcionario = funcionario;
	}

	@NotNull
	@ManyToOne(targetEntity = Fornecedor.class)
	@JoinColumn(name = "idfornecedor", nullable = false, referencedColumnName = "idfornecedor")
	public Fornecedor getFornecedor() {
		return fornecedor;
	}

	public void setFornecedor(Fornecedor fornecedor) {
		this.fornecedor = fornecedor;
	}

	@Transient
	public List<ItemEntrada> getItensEntrada() {
		return itensEntrada;
	}

	public void setItensEntrada(List<ItemEntrada> itensEntrada) {
		this.itensEntrada = itensEntrada;
	}

	public void addItem(ItemEntrada itemEntrada) {

		boolean isAdd = true;
		itemEntrada.setEntradaProduto(this);

		for (ItemEntrada itemEntradaAtual : this.itensEntrada) {
			if (itemEntradaAtual.getProduto().getId()
					.equals(itemEntrada.getProduto().getId())) {
				itemEntradaAtual.setQuantidade(itemEntrada.getQuantidade());
				itemEntradaAtual.setValorcompra(itemEntrada.getValorcompra());
				isAdd = false;
			}
		}

		if (isAdd) {
			this.itensEntrada.add(itemEntrada);
		}
	}

	@NotNull
	@Column(name = "valor_entrada", nullable = false)
	public double getValorEntrada() {
		return valorEntrada;
	}

	public void setValorEntrada(double valorEntrada) {
		this.valorEntrada = valorEntrada;
	}

}
